/*
 * Copyright (c) 2007 Sun Microsystems, Inc.  All rights reserved.
 *
 * Sun Microsystems, Inc. has intellectual property rights relating to technology embodied in the product
 * that is described in this document. In particular, and without limitation, these intellectual property
 * rights may include one or more of the U.S. patents listed at http://www.sun.com/patents and one or
 * more additional patents or pending patent applications in the U.S. and in other countries.
 *
 * U.S. Government Rights - Commercial software. Government users are subject to the Sun
 * Microsystems, Inc. standard license agreement and applicable provisions of the FAR and its
 * supplements.
 *
 * Use is subject to license terms. Sun, Sun Microsystems, the Sun logo, Java and Solaris are trademarks or
 * registered trademarks of Sun Microsystems, Inc. in the U.S. and other countries. All SPARC trademarks
 * are used under license and are trademarks or registered trademarks of SPARC International, Inc. in the
 * U.S. and other countries.
 *
 * UNIX is a registered trademark in the U.S. and other countries, exclusively licensed through X/Open
 * Company, Ltd.
 */
package com.sun.max.lang;

import java.lang.reflect.*;

import com.sun.max.program.*;

public interface StaticFieldLiteral {

    String literal();

    void setLiteral(String literal);

    Class literalClass();

    void setLiteralClass(Class literalClass);

    public static final class Static {

        private Static() {
        }

        public static void initialize(Class staticFieldLiteralClass) {
            for (Field field : staticFieldLiteralClass.getDeclaredFields()) {
                if ((field.getModifiers() & Modifier.STATIC) != 0 && StaticFieldLiteral.class.isAssignableFrom(field.getType())) {
                    field.setAccessible(true);
                    try {
                        final StaticFieldLiteral staticFieldLiteral = (StaticFieldLiteral) field.get(staticFieldLiteralClass);
                        staticFieldLiteral.setLiteral(field.getName());
                        staticFieldLiteral.setLiteralClass(staticFieldLiteralClass);
                    } catch (IllegalAccessException illegalAccessException) {
                        ProgramError.unexpected("could not name literal of field: " + field);
                    }
                }
            }
        }
    }

}
